#include <stdio.h>
#include <malloc.h>
typedef struct 
{
    int *data;
    size_t size ;
    size_t capacity;
    /* data */
}DynamicArr;

void initArr(DynamicArr *arr,size_t initalCapacity);
//释放动态数组
void destroyArr(DynamicArr *arr);
//在指定位置插入元素
void insertAt(DynamicArr *arr,size_t index,int element);
//扩容操作
static void resizeAt(DynamicArr *arr, size_t newCapacity);
//在结尾处插入元素
void insertEnd(DynamicArr *arr,int element);
//删除指定位置的元素
/**
 * @brief 删除指定位置的元素
 * @param arr 指向自定义DyniamicArr结构体变量指针
 * @param index 要删除元素的下标,从0开始
 * @return 无
 */
void removeAt(DynamicArr *arr,size_t index);
//对数组升序排序
void ascSoort(DynamicArr *arr);
//输出动态数组元素
void showArr(DynamicArr *arr);
int main(void)
{
    DynamicArr arry;
    initArr(&arry,5);
    //插入元素
    //insertAt(&arry,0,1);
    //insertAt(&arry,1,2);
    //printf("size:%ld\n",arry.size);
    //printf("capacity:%ld\n",arry.capacity);
    //扩容
    //insertAt(&arry,2,3);
    //  printf("size:%ld\n",arry.size);
    //printf("capacity:%ld\n",arry.capacity);
    //insertAt(&arry,1,666);
    //insertEnd(&arry,888);
    //insertEnd(&arry,999);
    insertEnd(&arry,45);
    insertEnd(&arry,62);
    insertEnd(&arry,15);
    insertEnd(&arry,78);
    insertEnd(&arry,30);
    ascSoort(&arry);
    showArr(&arry);
    

    destroyArr(&arry);
    return 0;
}

void initArr(DynamicArr *arr,size_t initalCapacity){
    arr->size=0;
    arr->capacity=initalCapacity;
    arr->data=malloc(sizeof(int)*initalCapacity);

}

void destroyArr(DynamicArr *arr){
    arr->size=0;
    arr->capacity=0;
    free(arr->data);
    arr->data=NULL;//设置空值，防止野指针
}

void insertAt(DynamicArr *arr,size_t index,int element){
    if(index>arr->size){
        printf("index out of range");
        return;
    }
    if(arr->size>=arr->capacity){
        //arr->capacity*=2;
        resizeAt(arr,arr->capacity*2);
    }
    //插入新元素
    //要先让旧元素移动位置
    for(size_t i=arr->size;i>index;i--){
        //元素向后移动腾出位置
        arr->data[i]=arr->data[i-1];
    }
    //在指定位置插入元素
    arr->data[index]=element;
    //更新有效元素个数
    arr->size++;

}

static void resizeAt(DynamicArr *arr, size_t newCapacity){
    arr->capacity=newCapacity;
    arr->data=(int*)realloc(arr->data,sizeof(int)*newCapacity);
}
void insertEnd(DynamicArr *arr,int element){
    //内部计算出尾元素的位置
    insertAt(arr,arr->size,element);
}
void showArr(DynamicArr *arr){
    for(size_t i=0;i<arr->size;i++){
        printf("%d\t",arr->data[i]);
    }
    printf("\n");
}
void ascSoort(DynamicArr *arr){
    int temp=0;
    for(size_t i=0;i<arr->size-1;i++){
        for(size_t j=0;j<arr->size-1-i;j++){
            //若当前元素比相邻的后面的元素大
            if(arr->data[j]>arr->data[j+1]){
            temp=arr->data[j];
            arr->data[j]=arr->data[j+1];
            arr->data[j+1]=temp;
        }
    }
}
}